package com.semac.client.componentes.listaministrantes;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.semac.shared.model.Pessoa;

public class SeletorDeMinistrantes extends Composite implements ValueChangeHandler<Boolean>, HasListaDeMinistranteChangeHandlers {

	private HashSet<Pessoa> listaDeMinistrantes = new HashSet<Pessoa>();
	
	private HashMap<CheckBox, Pessoa> mapeamentoCheckboxPessoa = new HashMap<CheckBox, Pessoa>();
	
	private HashMap<Pessoa, CheckBox> mapeamentoPessoaCheckBox = new HashMap<Pessoa, CheckBox>();
	
	
	
	private static SeletorDeMinistrantesUiBinder uiBinder = GWT.create(SeletorDeMinistrantesUiBinder.class);
	@UiField Label labelMinistrantesSelecionados;
	@UiField ScrollPanel scrollPanel;
	@UiField VerticalPanel checkBoxPanel;

	interface SeletorDeMinistrantesUiBinder extends UiBinder<Widget, SeletorDeMinistrantes> {
	}

	public SeletorDeMinistrantes() {
		initWidget(uiBinder.createAndBindUi(this));
	}
	
	
	/**
	 * Popula o seletor de ministrantes
	 * @param pessoas
	 */
	public void populaListaComPessoas(ArrayList<Pessoa> pessoas){
		this.mapeamentoCheckboxPessoa.clear();
		this.mapeamentoPessoaCheckBox.clear();
		this.checkBoxPanel.clear();
		
		Collections.sort(pessoas);
				
		for (Pessoa pessoa : pessoas) {
			//somente adiciona novos checkboxes para pessoas unicas
			if (this.mapeamentoPessoaCheckBox.get(pessoa) != null)
				continue;
			
			CheckBox chk = new CheckBox();
			chk.setText(pessoa.getNome());
			chk.addValueChangeHandler(this);
			
			this.mapeamentoCheckboxPessoa.put(chk, pessoa);
			this.mapeamentoPessoaCheckBox.put(pessoa, chk);
			this.checkBoxPanel.add(chk);
		}
		
		
	}
//
//	/**
//	 * Seta quais pessoas sao ministrantes usando sua id unica do banco
//	 * @param idsMinistrantes
//	 */
//	public void setMinistrantesUsandoIds(ArrayList<Integer> idsMinistrantes){
//		ArrayList<Pessoa> ministrantes = new ArrayList<Pessoa>();
//		for (Integer integer : idsMinistrantes) {
//			ministrantes.add(new Pessoa(integer));
//		}
//		this.setMinistrantes(ministrantes);
//	}
//	
	
	
	/**
	 * Seta as pessoas com seus respectivos checkboxes setados para true
	 * quando estas sao ministrantes. 
	 * @param pessoas
	 */
	public void setMinistrantes(ArrayList<Pessoa> ministrantes){
		for (CheckBox chk : this.mapeamentoCheckboxPessoa.keySet())
			chk.setValue(false);
		
		this.listaDeMinistrantes.clear();
		
		for (Pessoa pessoa : ministrantes) {
			if (this.mapeamentoPessoaCheckBox.get(pessoa) == null)
				continue;
			this.mapeamentoPessoaCheckBox.get(pessoa).setValue(true);
			this.listaDeMinistrantes.add(pessoa);
		}
		
		this.printListaPessoasSelecionadas();
	}
	

	/**
	 * Pega lista de ministrantes selecionados
	 * @return
	 */
	public ArrayList<Pessoa> getMinistrantes(){
		return new ArrayList<Pessoa>(this.listaDeMinistrantes);
	}
	
	
//	/**
//	 * Pega lista de ministrantes selecionados em forma de id da pessoa no banco
//	 * @return
//	 */
//	public ArrayList<Integer> getMinistrantesAsIdsDaPessoa(){
//		ArrayList<Integer> ids = new ArrayList<Integer>();
//		for (Pessoa pessoa : this.listaDeMinistrantes) {
//			ids.add(pessoa.getIdPessoa());
//		}
//		return ids;
//	}
//	
	
	@Override
	public void onValueChange(ValueChangeEvent<Boolean> event) {
		Pessoa pessoa = null;
		try{
			pessoa = this.mapeamentoCheckboxPessoa.get(event.getSource());
		}catch (Exception e) {}
		
		if (pessoa != null)
			if (event.getValue())
				this.listaDeMinistrantes.add(pessoa);
			else
				this.listaDeMinistrantes.remove(pessoa);
		
		this.fireEvent(new ListaDeMinistrantesChangeEvent(this.getMinistrantes()));
		this.printListaPessoasSelecionadas();
	}
		
	
	private void printListaPessoasSelecionadas(){
		String virgula = "";
		String pessoas = "";
		for (Pessoa pessoa : this.listaDeMinistrantes) {
			pessoas = pessoas + virgula + pessoa.getNome();
			virgula = ", ";
		}
		
		if (this.listaDeMinistrantes.size() == 0)
			pessoas = "Nenhum ministrante selecionado.";
		this.labelMinistrantesSelecionados.setText(pessoas);
	}
	
	
	@Override
	public HandlerRegistration addMinistrantesListChangeHandler(ListaDeMinistrantesChangeHandler handler) {
		return this.addHandler(handler, ListaDeMinistrantesChangeEvent.TYPE);
	}
	

}
